package ${package}.${rootArtifactId}.common.util;

import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * Number工具类
 *
 * @author weidong.lin
 * @date 2021/7/12 15:45
 */
public final class NumberUtil {

    /**
     * DecimalFormat
     */
    private static final DecimalFormat MY_FORMAT = new DecimalFormat("0.00");

    /**
     * 1000
     */
    public static final int THOUSAND = 1000;

    /**
     * 求和
     *
     * @param number number
     * @return 结果
     */
    public static double sum(Number... number) {
        double result = 0;
        if (number != null) {
            for (Number num : number) {
                result += num.doubleValue();
            }
        }
        return result;
    }

    /**
     * 如果是null 则返回0，否则返回原值
     *
     * @param number number
     * @param zero   zero
     * @param <N>    <N>
     * @return 结果
     */
    public static <N extends Number> N getZeroValue(N number, N zero) {
        return number == null ? zero : number;
    }

    /**
     * 如果是null或负值 则返回0，否则返回原值
     *
     * @param number number
     * @param zero   zero
     * @param <N>    <N>
     * @return 结果
     */
    public static <N extends Number> N getPositiveValue(N number, N zero) {
        if (number == null || number.doubleValue() < 0) {
            return zero;
        } else {
            return number;
        }
    }

    /**
     * isNull
     *
     * @param value value
     * @return 结果
     */
    public static boolean isNull(Long value) {
        return null == value;
    }

    /**
     * getNotNull
     * 如果null 返回0.0
     *
     * @param value value
     * @return 结果
     */
    public static Double getNotNull(Double value) {
        return value == null ? 0.0 : value;
    }

    /**
     * getNotNull
     * 如果null 返回0.0
     *
     * @param value value
     * @return 结果
     */
    public static Double getNotNull(BigDecimal value) {
        return value == null ? 0.0 : value.doubleValue();
    }

    /**
     * 将数字格式化成2位小数
     *
     * @param number number
     * @return 结果
     */
    public static String fmt2p(Number number) {
        return MY_FORMAT.format(number);
    }

    /**
     * anyEquals
     *
     * @param obj   obj
     * @param param param
     * @return 结果
     */
    public static boolean anyEquals(Number obj, Number... param) {
        if (CollectionsTools.isNotEmpty(param)) {
            for (Number o : param) {
                if (NumberUtil.isEquals(obj, o)) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 判断数值o1 和数值o2是否相等
     *
     * @param o1 o1
     * @param o2 o2
     * @return 结果
     */
    public static boolean isEquals(Number o1, Number o2) {
        boolean re;
        if (o1 == null || o2 == null) {
            re = false;
        } else if (o1.equals(o2)) {
            re = true;
        } else if (o1 instanceof Double || o1 instanceof Float || o2 instanceof Double || o2 instanceof Float) {
            re = (o1.doubleValue() == o2.doubleValue());
        } else {
            re = (o1.longValue() == o2.longValue());
        }
        return re;
    }

    /**
     * 判断数值o1 和数值o2是否相等
     *
     * @param o1 o1
     * @param o2 o2
     * @return 结果
     */
    public static boolean isNotEquals(Number o1, Number o2) {
        return !isEquals(o1, o2);
    }

    /**
     * 解析Short类型
     *
     * @param o o
     * @return 结果
     */
    public static Short parseShort(Object o) {
        Short re = null;
        if (o == null) {
            return re;
        }
        if (o instanceof Number) {
            re = ((Number) o).shortValue();
        } else if (o instanceof String) {
            try {
                re = Short.parseShort((String) o);
            } catch (NumberFormatException e) {
                Double d = parseDouble(o);
                if (d != null) {
                    re = d.shortValue();
                }
            }
        }
        return re;
    }

    /**
     * parseByte
     *
     * @param o o
     * @return 结果
     */
    public static Byte parseByte(Object o) {
        Byte re = null;
        if (o == null) {
            return re;
        }
        if (o instanceof Number) {
            re = ((Number) o).byteValue();
        } else if (o instanceof String) {
            try {
                re = Byte.parseByte((String) o);
            } catch (NumberFormatException e) {
                Double d = parseDouble(o);
                if (d != null) {
                    re = d.byteValue();
                }
            }
        }
        return re;
    }

    /**
     * parseInt
     *
     * @param o o
     * @return 结果
     */
    public static Integer parseInt(Object o) {
        Integer re = null;
        if (o == null) {
            return re;
        }
        if (o instanceof Number) {
            re = ((Number) o).intValue();
        } else if (o instanceof String) {
            try {
                re = Integer.parseInt((String) o);
            } catch (NumberFormatException e) {
                Double d = parseDouble(o);
                if (d != null) {
                    re = d.intValue();
                }
            }
        }
        return re;
    }

    /**
     * parseLong
     *
     * @param o o
     * @return 结果
     */
    public static Long parseLong(Object o) {
        Long re = null;
        if (o == null) {
            return re;
        }
        if (o instanceof Number) {
            re = ((Number) o).longValue();
        } else if (o instanceof String) {
            try {
                re = Long.parseLong((String) o);
            } catch (NumberFormatException e) {
                Double d = parseDouble(o);
                if (d != null) {
                    re = d.longValue();
                }
            }
        }
        return re;
    }

    /**
     * isNull0
     * 如果是null 则返回0
     *
     * @param value value
     * @return 结果
     */
    public static int isNull0(Integer value) {
        return isNull(value, 0);
    }

    /**
     * 如果是null 则返回newValue
     *
     * @param value    value
     * @param newValue newValue
     * @return 结果
     */
    public static int isNull(Integer value, int newValue) {
        return value == null ? newValue : value;
    }

    /**
     * 如果是null
     *
     * @param value value
     * @return 结果
     */
    public static boolean isNull(Integer value) {
        return value == null;
    }

    /**
     * parseFloat
     *
     * @param o o
     * @return 结果
     */
    public static Float parseFloat(Object o) {
        Float re = null;
        if (o instanceof Number) {
            re = ((Number) o).floatValue();
        } else if (o instanceof String) {
            try {
                re = Float.parseFloat((String) o);
            } catch (NumberFormatException e) {
                Double d = parseDouble(o);
                if (d != null) {
                    re = d.floatValue();
                }
            }
        }
        return re;
    }

    /**
     * parseDouble
     *
     * @param o o
     * @return 结果
     */
    public static Double parseDouble(Object o) {
        if (o instanceof Number) {
            return ((Number) o).doubleValue();
        } else if (o instanceof String) {
            try {
                return Double.parseDouble((String) o);
            } catch (NumberFormatException e) {
            }
        }
        return null;
    }

    /**
     * Description: 四舍五入
     *
     * @param enDouble 被四舍五入值
     * @param rountNum 精确到的位数：如：0,保留整数；1，保留一位小数
     * @return 结果
     * @Version1.0 2015-7-31 下午12:03:05 by 陈永旺（yw.chen02@10101111.com）创建
     */
    public static Double roundDouble(Double enDouble, int rountNum) {
        if (enDouble == null) {
            return null;
        }

        BigDecimal bd = BigDecimal.valueOf(enDouble);
        return bd.setScale(rountNum, BigDecimal.ROUND_HALF_UP).doubleValue();

    }

    /**
     * 数字转汉字
     *
     * @param str str
     * @return 结果
     */
    public static String getChinese(String str) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            switch (c) {
                case '.':
                    sb.append("");
                    break;
                case '0':
                    sb.append("");
                    break;
                case '1':
                    sb.append("一");
                    break;
                case '2':
                    sb.append("二");
                    break;
                case '3':
                    sb.append("三");
                    break;
                case '4':
                    sb.append("四");
                    break;
                case '5':
                    sb.append("五");
                    break;
                case '6':
                    sb.append("六");
                    break;
                case '7':
                    sb.append("七");
                    break;
                case '8':
                    sb.append("八");
                    break;
                case '9':
                    sb.append("九");
                    break;
                default:
                    sb.append("");
                    break;
            }
        }
        return sb.toString();

    }

    /**
     * 如果是null 返回defaultValue
     *
     * @param value        value
     * @param defaultValue defaultValue
     * @return 结果
     */
    public static int getOrDefault(Integer value, int defaultValue) {
        return value == null ? defaultValue : value;
    }

    /**
     * getOrDefault
     *
     * @param value        value
     * @param defaultValue defaultValue
     * @return 结果
     */
    public static double getOrDefault(Double value, double defaultValue) {
        return value == null ? defaultValue : value;
    }

    /**
     * getOrDefault
     *
     * @param value        value
     * @param defaultValue defaultValue
     * @return 结果
     */
    public static int getOrDefault(String value, int defaultValue) {
        if (null == value) {
            return defaultValue;
        }
        return getOrDefault(Integer.valueOf(value), defaultValue);
    }

    /**
     * NumberUtil
     */
    private NumberUtil() {

    }

    /**
     * isNullZero
     *
     * @param dou dou
     * @return isNullZero
     */
    public static boolean isNullZero(Double dou) {
        return dou == null || dou == 0.0;
    }

    /**
     * int类型数据与Integer类型数据equals比较
     *
     * @param intValue     int 类型数据
     * @param integerValue Integer 类型数据
     * @return boolean true 相等 ,false 不等
     */
    public static boolean equalsIntWithPackInteger(int intValue, Integer integerValue) {
        if (null == integerValue) {
            return false;
        }
        return intValue == integerValue;
    }

    /**
     * long 类型数据与 Long 类型数据equals比较
     *
     * @param longValue     long 类型数据
     * @param packLongValue Long 类型数据
     * @return boolean true 相等 ,false 不等
     */
    public static boolean equalsLongWithPackLong(long longValue, Long packLongValue) {
        if (null == packLongValue) {
            return false;
        }
        return longValue == packLongValue;
    }
}
